! Copyright (C) 2008 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license.
USING: alien.c-types alien.syntax assocs classes.struct
io.serial kernel system ;
IN: io.serial.linux.ffi

CONSTANT: NCCS 32

TYPEDEF: uchar cc_t
TYPEDEF: uint speed_t
TYPEDEF: uint tcflag_t

STRUCT: termios
    { iflag tcflag_t }
    { oflag tcflag_t }
    { cflag tcflag_t }
    { lflag tcflag_t }
    { line cc_t }
    { cc { cc_t NCCS } }
    { ispeed speed_t }
    { ospeed speed_t } ;

FUNCTION: speed_t cfgetispeed ( termios* t )
FUNCTION: speed_t cfgetospeed ( termios* t )
FUNCTION: int cfsetispeed ( termios* t, speed_t s )
FUNCTION: int cfsetospeed ( termios* t, speed_t s )
FUNCTION: int tcgetattr ( int i1, termios* t )
FUNCTION: int tcsetattr ( int i1, int i2, termios* t )
FUNCTION: int tcdrain ( int i1 )
FUNCTION: int tcflow ( int i1, int i2 )
FUNCTION: int tcflush ( int i1, int i2 )
FUNCTION: int tcsendbreak ( int i1, int i2 )
FUNCTION: void cfmakeraw ( termios* t )
FUNCTION: int cfsetspeed ( termios* t, speed_t s )

! See /usr/include/bits/termios.h
CONSTANT: TCSANOW     0
CONSTANT: TCSADRAIN   1
CONSTANT: TCSAFLUSH   2

CONSTANT: TCIFLUSH    0
CONSTANT: TCOFLUSH    1
CONSTANT: TCIOFLUSH   2

CONSTANT: TCOOFF      0
CONSTANT: TCOON       1
CONSTANT: TCIOFF      2
CONSTANT: TCION       3

! iflag
CONSTANT: IGNBRK  0o0000001
CONSTANT: BRKINT  0o0000002
CONSTANT: IGNPAR  0o0000004
CONSTANT: PARMRK  0o0000010
CONSTANT: INPCK   0o0000020
CONSTANT: ISTRIP  0o0000040
CONSTANT: INLCR   0o0000100
CONSTANT: IGNCR   0o0000200
CONSTANT: ICRNL   0o0000400
CONSTANT: IUCLC   0o0001000
CONSTANT: IXON    0o0002000
CONSTANT: IXANY   0o0004000
CONSTANT: IXOFF   0o0010000
CONSTANT: IMAXBEL 0o0020000
CONSTANT: IUTF8   0o0040000

! oflag
CONSTANT: OPOST   0o0000001
CONSTANT: OLCUC   0o0000002
CONSTANT: ONLCR   0o0000004
CONSTANT: OCRNL   0o0000010
CONSTANT: ONOCR   0o0000020
CONSTANT: ONLRET  0o0000040
CONSTANT: OFILL   0o0000100
CONSTANT: OFDEL   0o0000200
CONSTANT: NLDLY  0o0000400
CONSTANT:   NL0  0o0000000
CONSTANT:   NL1  0o0000400
CONSTANT: CRDLY  0o0003000
CONSTANT:   CR0  0o0000000
CONSTANT:   CR1  0o0001000
CONSTANT:   CR2  0o0002000
CONSTANT:   CR3  0o0003000
CONSTANT: TABDLY 0o0014000
CONSTANT:   TAB0 0o0000000
CONSTANT:   TAB1 0o0004000
CONSTANT:   TAB2 0o0010000
CONSTANT:   TAB3 0o0014000
CONSTANT: BSDLY  0o0020000
CONSTANT:   BS0  0o0000000
CONSTANT:   BS1  0o0020000
CONSTANT: FFDLY  0o0100000
CONSTANT:   FF0  0o0000000
CONSTANT:   FF1  0o0100000

! cflags
CONSTANT: CSIZE   0o0000060
CONSTANT:   CS5   0o0000000
CONSTANT:   CS6   0o0000020
CONSTANT:   CS7   0o0000040
CONSTANT:   CS8   0o0000060
CONSTANT: CSTOPB  0o0000100
CONSTANT: CREAD   0o0000200
CONSTANT: PARENB  0o0000400
CONSTANT: PARODD  0o0001000
CONSTANT: HUPCL   0o0002000
CONSTANT: CLOCAL  0o0004000
CONSTANT: CIBAUD  0o002003600000
CONSTANT: CRTSCTS 0o020000000000

! lflags
CONSTANT: ISIG    0o0000001
CONSTANT: ICANON  0o0000002
CONSTANT: XCASE   0o0000004
CONSTANT: ECHO    0o0000010
CONSTANT: ECHOE   0o0000020
CONSTANT: ECHOK   0o0000040
CONSTANT: ECHONL  0o0000100
CONSTANT: NOFLSH  0o0000200
CONSTANT: TOSTOP  0o0000400
CONSTANT: ECHOCTL 0o0001000
CONSTANT: ECHOPRT 0o0002000
CONSTANT: ECHOKE  0o0004000
CONSTANT: FLUSHO  0o0010000
CONSTANT: PENDIN  0o0040000
CONSTANT: IEXTEN  0o0100000

! c_cc characters
CONSTANT: VINTR 0
CONSTANT: VQUIT 1
CONSTANT: VERASE 2
CONSTANT: VKILL 3
CONSTANT: VEOF 4
CONSTANT: VTIME 5
CONSTANT: VMIN 6
CONSTANT: VSWTC 7
CONSTANT: VSTART 8
CONSTANT: VSTOP 9
CONSTANT: VSUSP 10
CONSTANT: VEOL 11
CONSTANT: VREPRINT 12
CONSTANT: VDISCARD 13
CONSTANT: VWERASE 14
CONSTANT: VLNEXT 15
CONSTANT: VEOL2 16

M: linux lookup-baud ( n -- n )
    H{
        { 0       0o0000000 }
        { 50      0o0000001 }
        { 75      0o0000002 }
        { 110     0o0000003 }
        { 134     0o0000004 }
        { 150     0o0000005 }
        { 200     0o0000006 }
        { 300     0o0000007 }
        { 600     0o0000010 }
        { 1200    0o0000011 }
        { 1800    0o0000012 }
        { 2400    0o0000013 }
        { 4800    0o0000014 }
        { 9600    0o0000015 }
        { 19200   0o0000016 }
        { 38400   0o0000017 }
        { 57600   0o0010001 }
        { 115200  0o0010002 }
        { 230400  0o0010003 }
        { 460800  0o0010004 }
        { 500000  0o0010005 }
        { 576000  0o0010006 }
        { 921600  0o0010007 }
        { 1000000 0o0010010 }
        { 1152000 0o0010011 }
        { 1500000 0o0010012 }
        { 2000000 0o0010013 }
        { 2500000 0o0010014 }
        { 3000000 0o0010015 }
        { 3500000 0o0010016 }
        { 4000000 0o0010017 }
    } ?at [ invalid-baud ] unless ;
